package com.longbo.jade.common;

import lombok.Data;
import org.apache.ibatis.annotations.Param;
import org.springframework.http.HttpStatus;

/**
 * API响应格式
 *
 * @author 龙博
 * @date 2021/3/19 14:22
 */
@Data
public final class ApiResponse {

    //响应码
    private Integer code = HttpStatus.OK.value();

    //提示语
    private String msg = "操作成功";

    //响应数据
    private Object data;

    //无参构造
    public ApiResponse() {
    }

    //全餐构造
    public ApiResponse(Integer code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 自定义的API返回格式
     *
     * @param code 响应码
     * @param msg  提示语
     * @param data 响应数据
     * @return
     */
    public static ApiResponse response(Integer code, String msg, Object data) {
        return new ApiResponse(code, msg, data);
    }

    /**
     * 操作成功 无自定义返回
     *
     * @return 无返回
     */
    public static ApiResponse success() {
        return ApiResponse.status(Status.SUCCESS, null);
    }

    /**
     * 操作成功 仅返回自定义消息
     *
     * @param msg 提示语
     * @return
     */
    public static ApiResponse success(String msg) {
        return response(Status.SUCCESS.getCode(), msg, null);
    }

    /**
     * 操作成功 仅返回数据
     *
     * @param data 响应数据
     * @return
     */
    public static ApiResponse success(Object data) {
        return status(Status.SUCCESS, data);
    }

    /**
     * 操作失败 无自定义返回
     *
     * @return
     */
    public static ApiResponse error() {
        return status(Status.FAILURE, null);
    }

    /**
     * 操作失败 仅返自定义消息
     *
     * @param msg 提示语
     * @return
     */
    public static ApiResponse error(String msg) {
        return response(Status.FAILURE.getCode(), msg, null);
    }

    /**
     * 操作失败 仅返回数据
     * @param data 响应数据
     * @return
     */
    public static ApiResponse error(Object data) {
        return status(Status.FAILURE,data);
    }

    /**
     *  仅有状态返回
     * @param status 状态  {@link Status}
     * @return
     */
    public static ApiResponse status(IStatus status){
        return response(status.getCode(),status.getMessage(),null);
    }

    /**
     * 有状态和数据返回
     * @param status 状态  {@link Status}
     * @param data   响应数据
     * @return
     */
    public static ApiResponse status(IStatus status, Object data) {
        return response(status.getCode(), status.getMessage(), data);
    }

}
